!function ($) {
    $.widget("changeCascade", {
        _create: function () {
            var $plugin = this;

            if (!$plugin.element.is(':select')
				|| !$plugin.options.target
				|| !$plugin.options.url
				|| $plugin.options.url.length === 0) {
                return;
            }

            $plugin.element.change(function () {
                var sourceValue = $plugin.element.val();

                if (sourceValue === '') {
                    return;
                }

                $plugin.options.data[$plugin.options.valueParameterName] = sourceValue;

                var previousTargetValue = $plugin.options.target.val();
                $plugin.options.target.empty();

                $.getJSON(
					$plugin.options.url,
					$plugin.options.data,
					function (data) {
					    $.each(data, function (i, item) {
					        var $option = $('<option />');
					        $option.html(item.Text)
								.val(item.Value);

					        $plugin.options.target.append($option);
					    });

					    $plugin.options.target.val(previousTargetValue);

					    if (previousTargetValue && previousTargetValue.length > 0 && $plugin.options.target.val() !== previousTargetValue) {
					        $plugin.options.target.change();
					    }
					}
				);
            });
        },
        options: {
            data: {},
            target: null,
            valueParameterName: 'id',
            url: ''
        }
    });
} (window.jQuery)